#ifndef _GAME_EVENT_H__
#define _GAME_EVENT_H__
#include "../fe8.h"
#include "../gba_types.h"
#include <stdint.h>

//一般type会根据8577688偏移指针设置
struct game_event{
    u32     type;
    u32     param;
};

/*
type = 2
    r0 为ge_data_t
    执行一次函数,然后事件往后偏移1次

type = 0xb
    返回1

type=0xf
    strb(ge+0x26,type>>0x10)

type=0x3
    str(ge+0xc,param)
    设置一直循环的事件,当0xc 为0时，将结束循环

type=0x4
    str(ge+0x8,param)
    param为函数指针,
    关闭时，会触发?

type=0x5
    param 一般为ge的数据指针
    8002BCC(param,event)
    一般执行一个外部事件，并行执行
        0x8a728fc   人物面板光暗效果
        0x8a728fc   人物面板名称
        0x8a72a30   有关人物面板名称的

type=0x6
    param 一般为ge的数据指针
    8002C30(param,event)

type=0x7
    8002BCC(param,get(event+0x24))

type=0x8
    8002DEC(param);
    直接创建一个游戏事件
    如果返回0，则退出当前事件
    否则，继续当前事件

type=0x9
    param 图层处理数据,[+4] 目标内存地址，对应的是一些图层属性
    8002FC8(param)

type=0xa
    未找到

type=0xc
    param未使用
    8002E74(type>>0x10)
    大概率是条件处理，跳转到目标标签? 配合 0xb?,0xb作为标签

type=0xd
    str(ge+0x4,param)
    str(ge+0xc,0)
    关闭循环，然后重新设置当前事件指针

type=0xe
    type>>0x10 不等于0 strh(ge+0x24,type>>0x10)
    str(ge+0xc,0x80031DC+1)

    type>>0x10:
        作为循环计数

type=0xf
    strb(ge+0x26,type>>0x10)

type=0x10
    退出当前事件循环
    返回0


*/

//游戏循环，帧更新，大概每帧60次
#define ge_set_update(func) 3,(u32)(test)

//执行完后，就结束
#define ge_do(func)     2,(u32)(func)

#define ge_end()        0,0

//屏幕关闭
/*
利用场景如，切换到人物面板时，如果不使用，则会花屏，显示地图和单位
*/
#define ge_screen_close     0x2000e,0

/*
暂时发现是在人物面板显示图层
*/
#define ge_screen_show      0x1000b,0

//关闭
#define ged_close(d) *((u32*)(d+0xC)) = 0


struct ge_data_t{
    u32     u00_;       //一般为ge基址
    u32     u04_;       //一般为当前ge位置
    u32     u08_;       //关闭时，会触发一次?
    const char* name;   //当前游戏事件的名称
    u32     u10_;
    u32     u14_;
    u32     u18_;
    u32     u1C_;   //应该是从这里申请的下一个事件
    u32     u20_;
    u16     u24_;       //一些事件使用这个地址作为计数器，如0xe 事件，则会循环执行0x80031DC,直到计数器为0,则关闭循环
    u16     u26_;       //
    u32     u28_;
    u32     u2C_;
    u32     u30_;
    u32     u34_;
    u32     u38_;
    u32     u3C_;
    u32     u30_;
    u32     u34_;
    u32     u38_;
    u32     u3C_;
    u32     u40_;
    u32     u44_;
    u32     u48_;
    u32     u4C_;
    u32     u40_;
    u32     u44_;
    u32     u48_;
    u32     u4C_;
    u32     u50_;
    u32     u54_;
    u32     u58_;
    u32     u5C_;
    u32     u50_;
    u32     u54_;
    u32     u58_;
    u32     u5C_;
    u32     u60_;
    u32     u64_;
    u32     u68_;   //最大0x6C字节
};

/*

*/

static
struct ge_data_t ge_create(u32*ge_event){
    return CALLT(0x8002DEC,ge_event);
}

static
void ge_free(struct ge_data_t *ge){
    //在ge_data_t->u00_ 为0时，会当成是free了
    //但是，一般情况下，是设置ge->u0C_  为0，自动结束
    CALLT(0x8002DE4,ge);
}


#endif